#include<iostream>
#include<stdlib.h>
using namespace std;

class stack
{
public:
	stack(int capacity = 4)
	{
		_a = (int*)malloc(sizeof(int) * capacity);
		if (_a == NULL)
		{
			perror("malloc fail\n");
			return;
		}
		_size = 0;
		_capacity = capacity;
	}

	//深拷贝
	stack(const stack& stk)
	{
		_a = (int*)malloc(sizeof(int) * stk._capacity);
		if (_a == NULL)
		{
			perror("malloc fail\n");
			return;
		}
		_size = stk._size;
		_capacity = stk._capacity;
	}

	void print()
	{
		cout << _a << " " << _size << " " << _capacity << endl;
	}
	~stack()
	{
		free(_a);
		_a = NULL;
		_size = 0;
		_capacity = 0;
	}
private:
	int* _a;
	int _size;
	int _capacity;
};

class Date
{
public:
	//构造函数
	//1.当我们没有定义构造函数时 编译器会自动生成默认构造函数 该默认构造函数对内置类型不做任何处理 对自定义类型会按照默认构造函数初始化
	//2.内置类型成员都有缺省值且符合我们的要求 不用写构造函数
	//3.全是自定义类型的构造 并且这些类型都定义默认构造函数 不用写构造函数
	//4.无参函数、全缺省函数以及编译器生成的构造函数（当我们没有定义构造函数）都叫做默认构造函数 默认构造函数只有一个
	Date(int year = 1, int month = 1, int day = 1)
	{
		cout << "Date()" << endl;
		_year = year;
		_month = month;
		_day = day;
	}

	//构造函数可以重载
	/*Date()
	{
		_year = 1;
		_month = 1;
		_day = 1;
	}*/
	void print()
	{
		cout << _year << "-" << _month << "-" << _day << endl;
		stk.print();
	}

	//拷贝构造函数 1.内置类型按字节顺序进行值拷贝/浅拷贝（使用默认拷贝构造函数） 内置类型进行深拷贝（不可以使用默认拷贝构造函数）自定义类型可以使用默认拷贝构造函数——调用他内部的拷贝函数
	//2.如果深拷贝但进行值拷贝（使用默认构造函数）可能会使两个变量指向同一块空间 析构两次会报错 对一个变量进行修改会影响另外一个变量
	//3.深拷贝必须写拷贝构造函数 只有值拷贝和自定义类型的拷贝可以调用编译器默认的拷贝构造函数

	//浅拷贝
	Date(const Date& d)
	{
		cout << "Date()" << endl;
		_year = d._year;
		_month = d._month;
		_day = d._day;
	}

	//析构函数  1.在对象生命周期结束时自动调用清理对象里的资源  默认析构函数对内置类型不做处理 对自定义类型按照默认析构函数的方式处理
	//2.动态申请资源就要写析构函数 没有动态申请资源就不用写析构函数
	//3.需要释放资源的成员都是自定义类型 编译器会自动生成默认析构函数
	~Date()
	{
		cout << "~Date()" << endl;
	}

private:
	//内置类型
	int _year;
	int _month;
	int _day;
	//自定义类型
	stack stk;
};

int main()
{
	//构造函数的调用
	Date d1(2024,7,8);
	d1.print();
	Date d2;
	d2.print();
	Date d3(d1);  //浅拷贝+调用内部的拷贝构造函数
	//Date d2();  无参调用时，以这种方式会被认为是函数的声明，编译器无法区分
	d3.print();

	stack stk1;
	stk1.print();
	stack stk2(stk1);  //深拷贝
	stk2.print();

	return 0;
}